<template>
    <div class="xtx-numbox">
      <div class="label" v-if="showLabel">数量</div>
      <div class="numbox">
        <a href="javascript:;" @click="decrease">-</a>
        <!--
          readonly: 只读 只能看不能改
          disabled: 禁用 只能看不能改 且有变灰样式

         -->
        <input type="text" readonly :value="count">
        <a href="javascript:;" @click="increase">+</a>
      </div>
    </div>
  </template>
<script>
import { ref, watch } from 'vue'
export default {
  name: 'XtxNumbox',
  // 发送事件，告诉给组件使用的人，该组件向外发送了哪些事件
  emits: ['update:modelValue'],
  // 接收数据
  props: {
    // v-model语法糖实现数据双向绑定
    modelValue: {
      type: Number,
      default: 1
    },
    // 控制数量最小值
    min: {
      type: Number,
      default: 1
    },
    // 控制数量最大值
    max: {
      type: Number,
      required: true
    },
    // 是否展示数量字样
    showLabel: {
      type: Boolean,
      default: true
    }

  },
  setup (props, { emit }) {
    // 数量
    const count = ref(props.modelValue)
    // 点击加
    const increase = () => {
      // 不能高于最大值
      if (count.value >= props.max) return
      count.value++
    }
    // 点击减
    const decrease = () => {
      // 不能低于最小值
      if (count.value <= props.min) return
      count.value--
    }
    // 侦听count 的变化
    // count :监听的对象 newVal 变化的新值
    watch(count, newVal => {
      // 监视count 的变化，同时将变化后的新值，通过v-model语法糖方法传递给父组件
      emit('update:modelValue', newVal)
    })

    return {
      count,
      increase,
      decrease
    }
  }
}
</script>
  <style scoped lang="less">
  .xtx-numbox {
    display: flex;
    align-items: center;
    .label {
      width: 60px;
      color: #999;
      padding-left: 10px;
    }
    .numbox {
      width: 120px;
      height: 30px;
      border: 1px solid #e4e4e4;
      display: flex;
      > a {
        width: 29px;
        line-height: 28px;
        text-align: center;
        background: #f8f8f8;
        font-size: 16px;
        color: #666;
        &:first-of-type {
          border-right:1px solid #e4e4e4;
        }
        &:last-of-type {
          border-left:1px solid #e4e4e4;
        }
      }
      > input {
        width: 60px;
        padding: 0 5px;
        text-align: center;
        color: #666;
      }
    }
  }
  </style>
